// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@

/* -*-java-*-
 * Filename	: SQLMXConnection.java
 * Description :
 */
package org.apache.trafodion.jdbc.t2;

import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale; // JDK 1.2
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.Executor;

import javax.sql.PooledConnection;

public class SQLMXConnection extends PreparedStatementManager implements
java.sql.Connection {

private static final short TYPE_UNKNOWN = 0;
private static final short TYPE_SELECT = 0x0001;
private static final short TYPE_UPDATE = 0x0002;
private static final short TYPE_DELETE = 0x0004;
private static final short TYPE_INSERT = 0x0008;
private static final short TYPE_INSERT_PARAM = 0x0120; //Modified for CQDs filter from 0x0100 to 0x0120
private static final short TYPE_EXPLAIN = 0x0010;
private static final short TYPE_CREATE = 0x0020;
private static final short TYPE_GRANT = 0x0040;
private static final short TYPE_DROP = 0x0080;
private static final short TYPE_CALL = 0x0800;
    static final short TYPE_CONTROL = 0x0900;

private static CallableStatement createExternalCallableStatement(
            String className, String call) throws SQLException {
        Class classX = null;

        /*
         * Check if the Class exists in the Class path.
         */
        try {
            classX = Class.forName(className);
        } catch (ClassNotFoundException e) {
            throw new SQLException("Specified Class not found: "
                    + e.getLocalizedMessage());
        }

        /*
         * Check if the Class implements the CallableStatement interface.
         */
        boolean blnIsCallableStatement = false;

        if (classX != null) {
            Class[] interfaces = classX.getInterfaces();
            for (int nfor = 0; nfor < interfaces.length; ++nfor) {
                if (interfaces[nfor].getName().equals(
                                CallableStatement.class.getName())) {
                    blnIsCallableStatement = true;
                    break;
                }
            }
        }
        if (!blnIsCallableStatement) {
            throw new SQLException(
                    "The Specified Class does not implement java.sql.CallableStatement interface.");
        }

        Constructor[] array = null;

        if (classX != null) {
            array = classX.getDeclaredConstructors();
        }

        if (array != null) {

            boolean blnPublic = false;

            for (int nfor = 0; nfor < array.length; ++nfor) {
                if (array[nfor].getModifiers() == Modifier.PUBLIC) {
                    blnPublic = true;
                    Class[] params = array[nfor].getParameterTypes();
                    if (params != null) {
                        if (params.length == 1) {
                            if (params[0].getName().equals(
                                            String.class.getName())) {
                                Object initVar[] = new Object[1];
                                initVar[0] = call;
                                Object o = null;
                                try {
                                    o = array[nfor].newInstance(initVar);
                                } catch (IllegalArgumentException e) {
                                    throw new SQLException(e.getMessage());
                                } catch (InstantiationException e) {
                                    throw new SQLException(e.getMessage());
                                } catch (IllegalAccessException e) {
                                    throw new SQLException(e.getMessage());
                                } catch (InvocationTargetException e) {
                                    throw new SQLException(e.getMessage());
                                }
                                return (CallableStatement) o;
                            }
                        }
                    }
                }
            }
            if (!blnPublic) {
                throw new SQLException(
                        "No Public Constructors available in the Specified Class.");
            }
        } else {
            throw new SQLException(
                    "No Constructors available in the Specified Class.");
        }
        throw new SQLException(
                "No Constructor available accepting ONLY java.lang.String parameter in the Specified Class.");
    }

    // java.sql.Connection interface methods
public void close() throws SQLException {
        if (this.getTracer() != null)
        this.getTracer().println(getTraceId() + "close()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_close_V].methodEntry(JdbcDebug.debugLevelPooling);
        try {
            // if it is a pooledConnection, don't do hardClose (Close SQL/MX
            // Resources)
            if (pc_ != null)
            close(false, true);
            else
            close(true, true);
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_close_V].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization commit() is now synchronized
     */
public synchronized void commit() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "commit()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_commit].methodEntry();
        try {
            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            if (autoCommit_)
            throw Messages.createSQLException(locale_,
                    "invalid_commit_mode", null);
            if (beginTransFlag_) {
                /*
                 * Transaction was started using Connection.begintransaction()
                 * API, set the autoCommit_ flag to true.
                 */
                autoCommit_ = true;
                beginTransFlag_ = false;
            }
            Statement cs = null;
            try {
                // commit the Transaction
                cs = this.createStatement();
                cs.execute("commit");
            } catch (SQLException se) {
                if (se.getErrorCode() != -8605)
                throw se;
            }finally {
                setTxid_(0);
                if(cs != null ) {
                    try {cs.close();} catch(Exception ce) {}
                }
            }
        }finally {
            if (JdbcDebugCfg.traceActive)
            debug[methodId_commit].traceOut(JdbcDebug.debugLevelEntry,
                    "beginTransFlag_ = " + beginTransFlag_
                    + "; autoCommit_ = " + autoCommit_
                    + "; txid_ = " + getTxid());
            if (JdbcDebugCfg.entryActive)
            debug[methodId_commit].methodExit();
        }
    }

public Statement createStatement() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "createStatement()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_createStatement].methodEntry();
        try {
            SQLMXStatement stmt = null;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            stmt = new SQLMXStatement(this);
            if (out_ != null)
            out_.println(getTraceId() + "createStatement() returns Statement ["
                    + stmt.getStmtLabel_() + "]");
            if (out_ != null) {
                return new TStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_createStatement].methodExit();
        }
    }

public Statement createStatement(int resultSetType, int resultSetConcurrency)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "createStatement(" + resultSetType + ","
                + resultSetConcurrency + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_createStatement_II].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_createStatement_II]
        .methodParameters("resultSetType=" + resultSetType
                + ", resultSetConcurrency=" + resultSetConcurrency);
        try {
            SQLMXStatement stmt = null;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            stmt = new SQLMXStatement(this, resultSetType, resultSetConcurrency);
            if (out_ != null)
            out_.println(getTraceId() + "createStatement(" + resultSetType + ","
                    + resultSetConcurrency + ") returns Statement ["
                    + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_createStatement_II].methodExit();
        }
    }

public Statement createStatement(int resultSetType,
            int resultSetConcurrency, int resultSetHoldability)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "createStatement(" + resultSetType + ","
                + resultSetConcurrency + "," + resultSetHoldability + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_createStatement_III].methodEntry();
        try {
            SQLMXStatement stmt = null;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            stmt = new SQLMXStatement(this, resultSetType,
                    resultSetConcurrency, resultSetHoldability);
            if (out_ != null)
            out_.println(getTraceId() + "createStatement(" + resultSetType + ","
                    + resultSetConcurrency + "," + resultSetHoldability
                    + ") returns Statement ["
                    + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_createStatement_III].methodExit();
        }
    }

public boolean getAutoCommit() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "getAutoCommit()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_getAutoCommit].methodEntry();
        try {
            clearWarnings();
            return autoCommit_;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getAutoCommit].methodExit();
        }
    }

public String getCatalog() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "getCatalog()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_getCatalog].methodEntry();
        try {
            clearWarnings();
            Statement s = null;
            ResultSet rs = null;
            String catalog = null;
            
            try {
                s = this.createStatement();
                rs = s.executeQuery("SHOWCONTROL DEFAULT CATALOG, match full, no header");
                rs.next();
                catalog = rs.getString(1);
                catalog = catalog.substring(catalog.indexOf('.') + 1);
            } catch (SQLException e) {
                return this.t2props.getCatalog();
            } finally {
                if (rs != null)
                    rs.close();
                if (s != null)
                    s.close();
            }
            return catalog;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getCatalog].methodExit();
        }
    }

public int getHoldability() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "getCatalog()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_getHoldability].methodEntry();
        try {
            clearWarnings();
            return holdability_;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getHoldability].methodExit();
        }
    }

public DatabaseMetaData getMetaData() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "getMetaData()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_getMetaData].methodEntry();
        try {
            SQLMXDatabaseMetaData metaData;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            metaData = new SQLMXDatabaseMetaData(this);
            if (out_ != null)
            out_.println(getTraceId() + "getMetaData() returns DatabaseMetaData ["
                    + System.identityHashCode(metaData) + "]");
            if(out_ != null) {
                return new TDatabaseMetaData(metaData, new TConnection(this, out_), out_);
            }
            return metaData;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getMetaData].methodExit();
        }
    }

public int getTransactionIsolation() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "getTransactionIsolation()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_getTransactionIsolation].methodEntry();
        try {
            clearWarnings();
            return transactionIsolation_;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getTransactionIsolation].methodExit();
        }
    }

    // JDK 1.2
public java.util.Map<String, Class<?>> getTypeMap() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "getTypeMap()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_getTypeMap].methodEntry();
        try {
            clearWarnings();
            return userMap_;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getTypeMap].methodExit();
        }
    }

public boolean isClosed() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "isClosed()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_isClosed].methodEntry();
        try {
            clearWarnings();
            return isClosed_;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_isClosed].methodExit();
        }
    }

public boolean isReadOnly() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "isReadOnly()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_isReadOnly].methodEntry();
        try {
            clearWarnings();
            return isReadOnly_;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_isReadOnly].methodExit();
        }
    }

public String nativeSQL(String sql) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "nativeSQL(\"" + sql + "\")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_nativeSQL].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_nativeSQL].methodParameters("sql=" + sql);
        try {
            clearWarnings();
            return sql;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_nativeSQL].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization prepareCall() is now synchronized
     */
public synchronized CallableStatement prepareCall(String sql)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareCall(\"" + sql + "\")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareCall_L].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareCall_L].methodParameters("sql=" + sql);
        try {

            if (!this.t2props.getExternalCallHandler().equals("NONE")) {
                String sqlX = sql;
                // Set the prefix:
                String prefix = "EXT";
                String callHandler = "NONE";

                if (!this.t2props.getExternalCallHandler().equals("NONE")) {
//					callHandler = SQLMXDataSource.externalCallHandler;
                    callHandler = this.t2props.getExternalCallHandler();
                }

                if (!this.t2props.getExternalCallPrefix().equalsIgnoreCase("EXT")) {
                    prefix = this.t2props.getExternalCallPrefix();
                }

                if (sqlX.trim().startsWith("{")) {
                    sqlX = sqlX.trim().substring(1).trim();
                    if (sqlX.toUpperCase().startsWith(prefix.toUpperCase())) {
                        CallableStatement externalCallStmt = SQLMXConnection
                        .createExternalCallableStatement(callHandler,
                                sql);
                        return externalCallStmt;
                    }
                }
            }
            SQLMXCallableStatement cstmt;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            gcStmts();
            if (isStatementCachingEnabled()) {
                cstmt = (SQLMXCallableStatement) getPreparedStatement(this,
                        sql.trim(), ResultSet.TYPE_FORWARD_ONLY,
                        ResultSet.CONCUR_READ_ONLY, holdability_);
                if (cstmt != null) {
                    if (out_ != null) {
                        out_.println(getTraceId() + "prepareCall(\"" + sql
                                + "\") returns CallableStatement ["
                                + cstmt.getStmtLabel_() + "]");
                        if (traceFlag_ >= T2Driver.POOLING_LVL) {
                            out_.println(getTraceId() + "prepareStatement(String,resultSetType,resultSetConcurrency,resultSetHoldability) "
                                    + cstmt.stmtId_+"\"+ GOT STMT FROM CACHE ");
                        }
                    }

                    if(out_ != null) {
                        return new TCallableStatement(cstmt, out_);
                    }
                    return cstmt;
                }
            }
            cstmt = new SQLMXCallableStatement(this, sql);

            pStmtCount++;
            if (out_ != null) {
                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() + "prepareCall(String) "
                            + "PREPARED STMT - " + "\""
                            + cstmt.stmtId_ + "\"");
                    out_.println(getTraceId() + "prepareCall(String) "
                            + "\""+"PREPARED STMT COUNT:"+this.pStmtCount
                            + "\"");
                }
            }

            if (this.t2props.getEnableLog().equalsIgnoreCase("ON"))
            printIdMapEntry(cstmt);
            cstmt.prepareCall(server_, getDialogueId(), getTxid(),
                    autoCommit_, transactionMode_, cstmt.getStmtLabel_(),
                    cstmt.sql_.trim(), cstmt.queryTimeout_,
                    cstmt.resultSetHoldability_, cstmt.fetchSize_);
            if (isStatementCachingEnabled()) {
                addPreparedStatement(this, cstmt.sql_.trim(), cstmt,
                        ResultSet.TYPE_FORWARD_ONLY,
                        ResultSet.CONCUR_READ_ONLY, holdability_);
            }
            addElement(cstmt);
            if (out_ != null)
            out_.println(getTraceId() + "prepareCall(\"" + sql
                    + "\") returns CallableStatement ["
                    + cstmt.getStmtLabel_() + "]");
            if (out_ != null) {
                return new TCallableStatement(cstmt, out_);
            }
            return cstmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareCall_L].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization prepareCall() is now synchronized
     */
public synchronized CallableStatement prepareCall(String sql,
            int resultSetType, int resultSetConcurrency) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareCall(\"" + sql + "\","
                + resultSetType + "," + resultSetConcurrency + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareCall_LII].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareCall_LII].methodParameters("sql=" + sql
                + ", resultSetType=" + resultSetType
                + ", resultSetConcurrency=" + resultSetConcurrency);
        try {
            SQLMXCallableStatement cstmt;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            gcStmts();
            if (isStatementCachingEnabled()) {
                cstmt = (SQLMXCallableStatement) getPreparedStatement(this,
                        sql.trim(), resultSetType, resultSetConcurrency, holdability_);
                if (cstmt != null) {
                    if (out_ != null) {
                        out_.println(getTraceId() + "prepareCall(\"" + sql + "\","
                                + resultSetType + "," + resultSetConcurrency
                                + ") returns CallableStatement ["
                                + cstmt.getStmtLabel_() + "]");
                        if (traceFlag_ >= T2Driver.POOLING_LVL) {
                            out_.println(getTraceId() + "prepareCall(String,resultSetType,resultSetConcurrency) "
                                    + cstmt.stmtId_+"\" GOT STMT FROM CACHE ");
                        }
                    }
                    if(out_ != null) {
                        return new TCallableStatement(cstmt, out_);
                    }
                    return cstmt;

                }
            }
            cstmt = new SQLMXCallableStatement(this, sql, resultSetType,
                    resultSetConcurrency);

            pStmtCount++;
            if (out_ != null) {
                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() + "prepareCall(String,resultSetType,resultSetConcurrency) "
                            + " PREPARED STMT - " + "\""
                            + cstmt.stmtId_ + "\"");
                    out_.println(getTraceId() + "prepareCall(String,resultSetType,resultSetConcurrency) "
                            + "\""+"PREPARED STMT COUNT:"+this.pStmtCount
                            + "\"");
                }
            }
            if (this.t2props.getEnableLog().equalsIgnoreCase("ON"))
            printIdMapEntry(cstmt);
            cstmt.prepareCall(server_, getDialogueId(), getTxid(),
                    autoCommit_, transactionMode_, cstmt.getStmtLabel_(),
                    cstmt.sql_.trim(), cstmt.queryTimeout_,
                    cstmt.resultSetHoldability_, cstmt.fetchSize_);
            if (isStatementCachingEnabled()) {
                addPreparedStatement(this, cstmt.sql_.trim(), cstmt,
                        resultSetType, resultSetConcurrency, holdability_);
            }
            addElement(cstmt);
            if (out_ != null)
            out_.println(getTraceId() + "prepareCall(\"" + sql + "\","
                    + resultSetType + "," + resultSetConcurrency
                    + ") returns CallableStatement ["
                    + cstmt.getStmtLabel_() + "]");
            if (out_ != null) {
                return new TCallableStatement(cstmt, out_);
            }
            return cstmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareCall_LII].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization prepareCall() is now synchronized
     */
public synchronized CallableStatement prepareCall(String sql,
            int resultSetType, int resultSetConcurrency,
            int resultSetHoldability) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareCall(\"" + sql + "\","
                + resultSetType + "," + resultSetConcurrency + ","
                + resultSetHoldability + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareCall_LIII].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareCall_LIII].methodParameters("sql=" + sql
                + ", resultSetType=" + resultSetType
                + ", resultSetConcurrency=" + resultSetConcurrency
                + ", resultSetHoldability=" + resultSetHoldability);
        try {
            SQLMXCallableStatement cstmt;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            gcStmts();
            if (isStatementCachingEnabled()) {
                cstmt = (SQLMXCallableStatement) getPreparedStatement(this, sql
                        .trim(), resultSetType, resultSetConcurrency,
                        resultSetHoldability);
                if (cstmt != null) {
                    if (out_ != null) {
                        out_.println(getTraceId() + "prepareCall(\"" + sql + "\","
                                + resultSetType + "," + resultSetConcurrency + ","
                                + resultSetHoldability + ") returns CallableStatement ["
                                + cstmt.getStmtLabel_() + "]");
                        if (traceFlag_ >= T2Driver.POOLING_LVL) {
                            out_.println(getTraceId() + "repareCall(String,resultSetType,resultSetConcurrency,resultSetHoldability)"
                                    + cstmt.stmtId_+"\"+ GOT STMT FROM CACHE ");
                        }
                    }

                    if(out_ != null) {
                        return new TCallableStatement(cstmt, out_);
                    }

                    return cstmt;
                }

            }
            cstmt = new SQLMXCallableStatement(this, sql, resultSetType,
                    resultSetConcurrency, resultSetHoldability);

            pStmtCount++;
            if (out_ != null) {
                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() + "prepareCall(String,resultSetType,resultSetConcurrency,resultSetHoldability) "
                            + " PREPARED STMT - " + "\""
                            + cstmt.stmtId_ + "\"");
                    out_.println(getTraceId() + "prepareCall(String,resultSetType,resultSetConcurrency,resultSetHoldability) "
                            +"\""+"PREPARED STMT COUNT:"+this.pStmtCount
                            + "\"");
                }
            }

            if (this.t2props.getEnableLog().equalsIgnoreCase("ON"))
            printIdMapEntry(cstmt);
            cstmt.prepareCall(server_, getDialogueId(), getTxid(),
                    autoCommit_, transactionMode_, cstmt.getStmtLabel_(),
                    cstmt.sql_.trim(), cstmt.queryTimeout_,
                    cstmt.resultSetHoldability_, cstmt.fetchSize_);
            if (isStatementCachingEnabled()) {
                addPreparedStatement(this, cstmt.sql_.trim(), cstmt,
                        resultSetType, resultSetConcurrency,
                        resultSetHoldability);
            }
            addElement(cstmt);
            if (out_ != null)
            out_.println(getTraceId() + "prepareCall(\"" + sql + "\","
                    + resultSetType + "," + resultSetConcurrency + ","
                    + resultSetHoldability + ") returns CallableStatement ["
                    + cstmt.getStmtLabel_() + "]");
            if (out_ != null) {
                return new TCallableStatement(cstmt, out_);
            }
            return cstmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareCall_LIII].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization prepareStatement() is now synchronized
     */
public synchronized PreparedStatement prepareStatement(String sql)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareStatement_L].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareStatement_L].methodParameters("sql=" + sql);
        try {
            SQLMXPreparedStatement pstmt;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            gcStmts();
            if (isStatementCachingEnabled()) {
                pstmt = (SQLMXPreparedStatement) getPreparedStatement(this,
                        sql.trim(), ResultSet.TYPE_FORWARD_ONLY,
                        ResultSet.CONCUR_READ_ONLY, holdability_);
                if (pstmt != null) {
                    if (out_ != null) {
                        out_.println(getTraceId() + "prepareStatement(\"" + sql
                                + "\") returns PreparedStatement ["
                                + (pstmt).getStmtLabel_() + "]");
                        if (traceFlag_ >= T2Driver.POOLING_LVL) {
                            out_.println(getTraceId() + "prepareStatement(String) "
                                    + pstmt.stmtId_+"\"+ GOT STMT FROM CACHE ");
                        }
                    }
                    if(out_ != null) {
                        return new TPreparedStatement(pstmt, out_);
                    }
                    return pstmt;
                }
            }
            pstmt = new SQLMXPreparedStatement(this, sql);

            pStmtCount++;
            if (out_ != null) {
                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() + "prepareStatement(String) "
                            + " PREPARED STMT - " + "\""
                            + pstmt.stmtId_ + "\"");
                    out_.println(getTraceId() + "prepareStatement(String) "
                            +"\""+"PREPARED STMT COUNT:"+this.pStmtCount
                            + "\"");
                }
            }

            if (this.t2props.getEnableLog().equalsIgnoreCase("ON"))
            printIdMapEntry(pstmt);

            // not insert
            int batchBindingSizePrev = 0;
//			if (SQLMXConnection.getSqlStmtType(sql) != SQLMXConnection.TYPE_INSERT
//					&& SQLMXConnection.getSqlStmtType(sql) != SQLMXConnection.TYPE_INSERT_PARAM) {
//
//				batchBindingSizePrev = batchBindingSize_;
//				batchBindingSize_ = 0;
//			}
//
/*  Selva
            if ( pstmt.getSqlType() != SQLMXConnection.TYPE_INSERT
                    && pstmt.getSqlType() != SQLMXConnection.TYPE_INSERT_PARAM
                    && pstmt.getSqlType() != SQLMXConnection.TYPE_UPDATE
                    && pstmt.getSqlType() != SQLMXConnection.TYPE_DELETE
            )
            {

                batchBindingSizePrev = this.t2props.getBatchBinding();
                batchBindingSize_ = 0;
            }
*/

            pstmt.prepare(server_, getDialogueId(), getTxid(), autoCommit_,
                        pstmt.getStmtLabel_(), pstmt.sql_.trim(), pstmt.isSelect_,
                        pstmt.queryTimeout_, pstmt.resultSetHoldability_,
                        batchBindingSize_, pstmt.fetchSize_);

            // value
//			if (SQLMXConnection.getSqlStmtType(sql) != SQLMXConnection.TYPE_INSERT
//					&& SQLMXConnection.getSqlStmtType(sql) != SQLMXConnection.TYPE_INSERT_PARAM) {
//
//				batchBindingSize_ = batchBindingSizePrev;
//			}
/*
            if (pstmt.getSqlType() != SQLMXConnection.TYPE_INSERT
                    && pstmt.getSqlType() != SQLMXConnection.TYPE_INSERT_PARAM
                    && pstmt.getSqlType() != SQLMXConnection.TYPE_UPDATE
                    && pstmt.getSqlType() != SQLMXConnection.TYPE_DELETE
            )
            {
                batchBindingSize_ = batchBindingSizePrev;
            }
            // End
*/

            if (isStatementCachingEnabled()) {
                addPreparedStatement(this, pstmt.sql_.trim(), pstmt,
                        ResultSet.TYPE_FORWARD_ONLY,
                        ResultSet.CONCUR_READ_ONLY, holdability_);
            }
            addElement(pstmt);
            if (out_ != null)
            out_.println(getTraceId() + "prepareStatement(\"" + sql
                    + "\") returns PreparedStatement ["
                    + (pstmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TPreparedStatement(pstmt, out_);
            }
            return pstmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareStatement_L].methodExit();
        }
    }

public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                + autoGeneratedKeys + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareStatement_LI].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareStatement_LI].methodParameters("sql=" + sql
                + ", autoGeneratedKeys=" + autoGeneratedKeys);
        try {
            if (autoGeneratedKeys != SQLMXStatement.NO_GENERATED_KEYS)
            throw Messages.createSQLException(locale_,
                    "auto_generated_keys_not_supported", null);
            SQLMXPreparedStatement stmt = (SQLMXPreparedStatement) prepareStatement(sql);
            if (out_ != null)
            out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                    + autoGeneratedKeys + ") returns PreparedStatement ["
                    + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TPreparedStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareStatement_LI].methodExit();
        }
    }

public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                + columnIndexes + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareStatement_LI_array].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareStatement_LI_array]
        .methodParameters("sql=" + sql + ", int["
                + columnIndexes.length + "] columnIndexes");
        try {
            if (columnIndexes != null && columnIndexes.length > 0)
            throw Messages.createSQLException(locale_,
                    "auto_generated_keys_not_supported", null);
            SQLMXPreparedStatement stmt = (SQLMXPreparedStatement) prepareStatement(sql);
            if (out_ != null)
            out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                    + columnIndexes + ") returns PreparedStatement ["
                    + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TPreparedStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareStatement_LI_array].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization prepareStatement() is now synchronized
     */
public synchronized PreparedStatement prepareStatement(String sql,
            int resultSetType, int resultSetConcurrency) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                + resultSetType + "," + resultSetConcurrency + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareStatement_LII].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareStatement_LII].methodParameters("sql=" + sql
                + ", resultSetType=" + resultSetType
                + ", resultSetConcurrency=" + resultSetConcurrency);
        try {
            SQLMXPreparedStatement stmt;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            gcStmts();
            if (isStatementCachingEnabled()) {
                stmt = (SQLMXPreparedStatement) getPreparedStatement(this, sql
                        .trim(), resultSetType, resultSetConcurrency,
                        holdability_);
                if (stmt != null) {
                    if (out_ != null) {
                        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                                + resultSetType + "," + resultSetConcurrency
                                + ") returns PreparedStatement ["
                                + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
                        if (traceFlag_ >= T2Driver.POOLING_LVL) {
                            out_.println(getTraceId() + "prepareStatement(String,resultSetType,resultSetConcurrency) "
                                    + stmt.stmtId_+"\"+ GOT STMT FROM CACHE ");
                        }
                    }
                    if(out_ != null) {
                        return new TPreparedStatement(stmt, out_);
                    }
                    return stmt;
                }
            }
            stmt = new SQLMXPreparedStatement(this, sql, resultSetType,
                    resultSetConcurrency);

            pStmtCount++;
            if (out_ != null) {
                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() + "prepareStatement(String,resultSetType,resultSetConcurrency) "
                            + " PREPARED STMT - " + "\""
                            + stmt.stmtId_ + "\"");
                    out_.println(getTraceId() + "prepareStatement(String,resultSetType,resultSetConcurrency) "
                            +"\""+"PREPARED STMT COUNT:"+this.pStmtCount
                            + "\"");
                }
            }

            if (this.t2props.getEnableLog().equalsIgnoreCase("ON"))
            printIdMapEntry(stmt);
/*
            // is not insert
            int batchBindingSizePrev = 0;
            if (stmt.getSqlType() != SQLMXConnection.TYPE_INSERT
                    && stmt.getSqlType() != SQLMXConnection.TYPE_INSERT_PARAM) {

                batchBindingSizePrev = this.t2props.getBatchBinding();
                batchBindingSize_ = 0;
            }
*/

                stmt.prepare(server_, getDialogueId(), getTxid(),
                        autoCommit_, stmt.getStmtLabel_(), stmt.sql_.trim(),
                        stmt.isSelect_, stmt.queryTimeout_,
                        stmt.resultSetHoldability_, batchBindingSize_,
                        stmt.fetchSize_);
/*
            if (stmt.getSqlType() != SQLMXConnection.TYPE_INSERT
                    && stmt.getSqlType() != SQLMXConnection.TYPE_INSERT_PARAM) {

                batchBindingSize_ = batchBindingSizePrev;
            }
*/
            if (isStatementCachingEnabled()) {
                addPreparedStatement(this, stmt.sql_.trim(), stmt,
                        resultSetType, resultSetConcurrency, holdability_);
            }
            addElement(stmt);
            if (out_ != null)
            out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                    + resultSetType + "," + resultSetConcurrency
                    + ") returns PreparedStatement ["
                    + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TPreparedStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareStatement_LII].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization prepareStatement() is now synchronized
     */
public synchronized PreparedStatement prepareStatement(String sql,
            int resultSetType, int resultSetConcurrency,
            int resultSetHoldability) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                + resultSetType + "," + resultSetConcurrency + ","
                + resultSetHoldability + ")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareStatement_LIII].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareStatement_LIII].methodParameters("sql=" + sql
                + ", resultSetType=" + resultSetType
                + ", resultSetConcurrency=" + resultSetConcurrency
                + ", resultSetHoldability=" + resultSetHoldability);
        try {
            SQLMXPreparedStatement stmt;

            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            connectInit();
            gcStmts();
            if (isStatementCachingEnabled()) {
                stmt = (SQLMXPreparedStatement) getPreparedStatement(this, sql
                        .trim(), resultSetType, resultSetConcurrency,
                        resultSetHoldability);
                if (stmt != null) {
                    if (out_ != null) {
                        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                                + resultSetType + "," + resultSetConcurrency + ","
                                + resultSetHoldability + ") returns PreparedStatement ["
                                + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
                        if (traceFlag_ >= T2Driver.POOLING_LVL) {
                            out_.println(getTraceId() + "prepareStatement(String,resultSetType,resultSetConcurrency,resultSetHoldability) "
                                    + stmt.stmtId_+"\"+ GOT STMT FROM CACHE ");
                        }
                    }
                    if(out_ != null) {
                        return new TPreparedStatement(stmt, out_);
                    }
                    return stmt;
                }
            }
            stmt = new SQLMXPreparedStatement(this, sql, resultSetType,
                    resultSetConcurrency, resultSetHoldability);

            pStmtCount++;
            if (out_ != null) {
                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() + "prepareStatement(String,resultSetType,resultSetConcurrency,resultSetHoldability) "
                            + " PREPARED STMT - " + "\""
                            + stmt.stmtId_ + "\"");
                    out_.println(getTraceId() + "prepareStatement(String,resultSetType,resultSetConcurrency,resultSetHoldability) "
                            +"\""+"PREPARED STMT COUNT:"+this.pStmtCount
                            + "\"");
                }
            }

            if (this.t2props.getEnableLog().equalsIgnoreCase("ON"))
            printIdMapEntry(stmt);
/*
            batchBindingSizePrev = this.t2props.getBatchBinding();
            // is not insert
            int batchBindingSizePrev = 0;
            if (stmt.getSqlType() != SQLMXConnection.TYPE_INSERT
                    &&stmt.getSqlType() != SQLMXConnection.TYPE_INSERT_PARAM) {

                batchBindingSizePrev = this.t2props.getBatchBinding();
                batchBindingSize_ = 0;
            }

*/
                stmt.prepare(server_, getDialogueId(), getTxid(),
                        autoCommit_, stmt.getStmtLabel_(), stmt.sql_.trim(),
                        stmt.isSelect_, stmt.queryTimeout_,
                        stmt.resultSetHoldability_, batchBindingSize_,
                        stmt.fetchSize_);
/*

            if (stmt.getSqlType() != SQLMXConnection.TYPE_INSERT
                    && stmt.getSqlType() != SQLMXConnection.TYPE_INSERT_PARAM) {

                batchBindingSize_ = batchBindingSizePrev;
            }
*/
            if (isStatementCachingEnabled()) {
                addPreparedStatement(this, stmt.sql_.trim(), stmt,
                        resultSetType, resultSetConcurrency,
                        resultSetHoldability);
            }
            addElement(stmt);
            if (out_ != null)
            out_.println(getTraceId() + "prepareStatement(\"" + sql + "\","
                    + resultSetType + "," + resultSetConcurrency + ","
                    + resultSetHoldability
                    + ") returns PreparedStatement ["
                    + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TPreparedStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareStatement_LIII].methodExit();
        }
    }

public PreparedStatement prepareStatement(String sql, String[] columnNames)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "prepareStatement(\"" + sql + "\")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_prepareStatement_LL_array].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_prepareStatement_LL_array].methodParameters("sql="
                + sql + ", String[" + columnNames.length + "] columnNames");
        try {
            if (columnNames != null && columnNames.length > 0)
            throw Messages.createSQLException(locale_,
                    "auto_generated_keys_not_supported", null);
            SQLMXPreparedStatement stmt = (SQLMXPreparedStatement) prepareStatement(sql);
            if (out_ != null)
            out_.println(getTraceId() + "prepareStatement(\"" + sql
                    + "\") returns PreparedStatement ["
                    + ((SQLMXStatement) stmt).getStmtLabel_() + "]");
            if (out_ != null) {
                return new TPreparedStatement(stmt, out_);
            }
            return stmt;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_prepareStatement_LL_array].methodExit();
        }
    }

    //**************************************************************************
    // * Function: releaseSavepoint(Savepoint)
    // *
    // * Description: This is a required method for the JDBC 3.0 API. This
    // method
    // * takes a Savepoint object as a parameter and removes it from
    // * current transaction.
    // *
    // * Input: Savepoint object, one that was previous saved.
    // *
    // * NOTE: This is an unsupported function, calling it will cause an
    // * unsupported exception to be thown.
    // *
    //**************************************************************************
    // *

public void releaseSavepoint(Savepoint savepoint) throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_releaseSavepoint].methodEntry();
        try {
            clearWarnings();
            Messages.throwUnsupportedFeatureException(locale_,
                    "releaseSavepoint()");
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_releaseSavepoint].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization rollback() is now synchronized.
     */
public synchronized void rollback() throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "rollback()");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_rollback_V].methodEntry();
        try {
            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            if (autoCommit_)
            throw Messages.createSQLException(locale_,
                    "invalid_commit_mode", null);

            if (beginTransFlag_) {
                /*
                 * Transaction was started using Connection.begintransaction()
                 * API, set the autoCommit_ flag to true.
                 */
                autoCommit_ = true;
                beginTransFlag_ = false;
            }
            Statement cs = null;
            try {
                // commit the Transaction
                cs = this.createStatement();
                cs.execute("rollback");
            } catch (SQLException se) {
                if (se.getErrorCode() != -8609)
                throw se;
            }finally {
                if(cs != null) {
                    try {cs.close();} catch(Exception ee) {}
                }
                setTxid_(0);
            }
        }finally {
            if (JdbcDebugCfg.traceActive)
            debug[methodId_rollback_V].traceOut(JdbcDebug.debugLevelEntry,
                    "beginTransFlag_ = " + beginTransFlag_
                    + "; autoCommit_ = " + autoCommit_
                    + "; txid_ = " + getTxid());
            if (JdbcDebugCfg.entryActive)
            debug[methodId_rollback_V].methodExit();
        }
    }

    //**************************************************************************
    // * Function: rollback(SavePoint)
    // *
    // * Description: This is a required method for the JDBC 3.0 API. This
    // method
    // * takes a Savepoint object as a parameter and roll back to when
    // * that Savepoint object was taken.
    // *
    // * Input: Savepoint object, one that was previous saved.
    // *
    // * NOTE: This is an unsupported function, calling it will cause an
    // * unsupported exception to be thown.
    // *
    //**************************************************************************
    // *

public void rollback(Savepoint savepoint) throws SQLException {
        if (out_ != null) {
            out_.println(getTraceId() + "rollback (" + savepoint + ")");
        }
        if (JdbcDebugCfg.entryActive)
        debug[methodId_rollback_L].methodEntry();
        try {
            clearWarnings();
            Messages.throwUnsupportedFeatureException(locale_,
                    "rollback(Savepoint)");
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_rollback_L].methodExit();
        }
    }

public void setAutoCommit(boolean autoCommit) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "setAutoCommit(" + autoCommit + ")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_setAutoCommit].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_setAutoCommit].methodParameters("autoCommit="
                + autoCommit);
        try {
            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_, "invalid_connection", null);
            if(this.getAutoCommit() == autoCommit) {
                return;
            }
            //changes to comply with standards, if autocommit mode is same then NO-OP
            // Don't allow autoCommit false when internal txn mode
            if (transactionMode_ == TXN_MODE_INTERNAL)
            autoCommit_ = true;
            else
            {
                if (autoCommit_ != autoCommit)
                {
                    if (connectInitialized_)
                    setAutoCommit(server_, getDialogueId(), autoCommit);
                    autoCommit_ = autoCommit;
                }
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setAutoCommit].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization setCatalog() is now synchronized.
     */
public synchronized void setCatalog(String catalog) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "setCatalog(\"" + catalog + "\")");
        if (JdbcDebugCfg.entryActive)
        debug[methodId_setCatalog].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_setCatalog].methodParameters("catalog=" + catalog);
        try {
            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            if (catalog != null) {
                setCatalog(server_, getDialogueId(), catalog);
                if (!catalog.startsWith("\""))
                catalog_ = catalog.toUpperCase();
                else
                catalog_ = catalog;
                updateConnectionReusability(SQL_SET_CATALOG);
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setCatalog].methodExit();
        }
    }

public void setHoldability(int holdability) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "setHoldability(\"" + holdability + "\")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_setHoldability].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_setHoldability].methodParameters("holdability="
                + holdability);
        try {
            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            if (holdability != SQLMXResultSet.HOLD_CURSORS_OVER_COMMIT
                    && holdability != SQLMXResultSet.CLOSE_CURSORS_AT_COMMIT)
            throw Messages.createSQLException(locale_,
                    "invalid_holdability", null);
            holdability_ = holdability;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setHoldability].methodExit();
        }
    }

public void setReadOnly(boolean readOnly) throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "setReadOnly(" + readOnly + ")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_setReadOnly].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_setReadOnly]
        .methodParameters("readOnly=" + readOnly);
        try {
            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            // setReadOnly(server_, dialogueId_, readOnly);
            isReadOnly_ = readOnly;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setReadOnly].methodExit();
        }
    }

    //**************************************************************************
    // * Function: setSavepoint(String)
    // *
    // * Description: This is a required method for the JDBC 3.0 API. This
    // method
    // * takes a String object as a parameter and returns a Savepoint
    // * object.
    // *
    // * Input: String Object - Optional name of the setpoint.
    // * Returns: Setpoint Object - used to roll back to this point in time.
    // *
    // * NOTE: This is an unsupported function, calling it will cause an
    // * unsupported exception to be thown.
    // *
    //**************************************************************************
    // *

public Savepoint setSavepoint(String name) throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_setSavepoint_L].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_setSavepoint_L].methodParameters("name=" + name);
        try {
            clearWarnings();
            Messages.throwUnsupportedFeatureException(locale_, "setSavepoint");
            return null;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setSavepoint_L].methodExit();
        }
    }

    //**************************************************************************
    // * Function: setSavepoint()
    // *
    // * Description: This is a required method for the JDBC 3.0 API. This
    // method
    // * takes no parameter and returns a Savepoint object.
    // *
    // * Input: None.
    // * Returns: Setpoint Object - used to roll back to this point in time.
    // *
    // * NOTE: This is an unsupported function, calling it will cause an
    // * unsupported exception to be thown.
    // *
    //**************************************************************************
    // *

public Savepoint setSavepoint() throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_setSavepoint_V].methodEntry();
        try {
            clearWarnings();
            Messages.throwUnsupportedFeatureException(locale_, "setSavepoint");
            return null;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setSavepoint_V].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization setTransactionIsolation() is now
     * synchronized.
     */
public synchronized void setTransactionIsolation(int level)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "setTransactionIsolation(" + level + ")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_setTransactionIsolation].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_setTransactionIsolation].methodParameters("level="
                + level);
        try {
            clearWarnings();
            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            switch (level) {
                case TRANSACTION_NONE:
                case TRANSACTION_READ_UNCOMMITTED:
                case TRANSACTION_READ_COMMITTED:
                case TRANSACTION_REPEATABLE_READ:
                case TRANSACTION_SERIALIZABLE:
                // Check if connection is open
                setTransactionIsolation(server_, getDialogueId(),
                        mapTxnIsolation(level));
                transactionIsolation_ = level;
                updateConnectionReusability(SQL_SET_TRANSACTION);
                break;
                default:
                throw Messages.createSQLException(locale_,
                        "invalid_transaction_isolation", null);
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setTransactionIsolation].methodExit();
        }
    }

    // JDK 1.2
public void setTypeMap(java.util.Map<String, Class<?>> map)
    throws SQLException {
        if (out_ != null)
        out_.println(getTraceId() + "setTypeMap(" + map + ")");

        if (out_ != null)
        out_.println(getTraceId() + "setTypeMap(" + map + ")");

        if (JdbcDebugCfg.entryActive)
        debug[methodId_setTypeMap].methodEntry();
        try {
            clearWarnings();
            userMap_ = map;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_setTypeMap].methodExit();
        }
    }

public synchronized void begintransaction() throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_begintransaction].methodEntry();
        try {
            int txid;

            if (isClosed_)
            throw Messages.createSQLException(locale_,
                    "invalid_connection", null);
            if (getTxid() != 0)
            throw Messages.createSQLException(locale_,
                    "invalid_transaction_state", null);

            txid = beginTransaction(server_, getDialogueId());
            if (txid != 0) {
                setTxid_(txid);
                autoCommit_ = false;

                /*
                 * This flag was introduced to resolve the problem with BEGIN
                 * WORK COMMIT WORK and ROLLBACK WORK in SQLJ clause. The
                 * autoCommit flag set to false by SQLJ BEGIN WORK should to
                 * reset to true in SQLJ COMMIT WORK and ROLLBACK WORK.
                 */

                beginTransFlag_ = true;
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_begintransaction].methodExit();
        }
    }

    // Other methods
private int mapTxnIsolation(int level) {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_mapTxnIsolation].methodEntry();
        if (JdbcDebugCfg.traceActive)
        debug[methodId_mapTxnIsolation].methodParameters("level=" + level);
        try {
            int isolationLevel;

            switch (level) {
                case TRANSACTION_NONE: // May be we default to SQL/MX default
                isolationLevel = SQL_TXN_READ_COMMITTED;
                break;
                case TRANSACTION_READ_COMMITTED:
                isolationLevel = SQL_TXN_READ_COMMITTED;
                break;
                case TRANSACTION_READ_UNCOMMITTED:
                isolationLevel = SQL_TXN_READ_UNCOMMITTED;
                break;
                case TRANSACTION_REPEATABLE_READ:
                isolationLevel = SQL_TXN_REPEATABLE_READ;
                break;
                case TRANSACTION_SERIALIZABLE:
                isolationLevel = SQL_TXN_SERIALIZABLE;
                break;
                default:
                isolationLevel = SQL_TXN_READ_COMMITTED;
                break;
            }
            return isolationLevel;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_mapTxnIsolation].methodExit();
        }
    }

    long getNextRSCount() {
        return ++rsCount_;
    }

    /*
     * RFE: Connection synchronization gcStmts()is now synchronized.
     */
    synchronized void gcStmts() {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_gcStmts].methodEntry();
        try {
            Reference pRef;
            //Venu changed stmtId from int to long for 64 bit
            long stmtId;
            Long stmtObject;

            while ((pRef = refQ_.poll()) != null) {
                Object obj = refToStmt_.get(pRef);
                if (obj != null) {
                    stmtObject = (Long)obj;
                    // All PreparedStatement objects are added to HashMap
                    // Only Statement objects that produces ResultSet are added
                    // to
                    // HashMap
                    // Hence stmtLabel could be null
                    if (stmtObject != null) {
                        stmtId = stmtObject.intValue();
                        try {
                            SQLMXStatement.close(server_, getDialogueId(),
                                    stmtId, true);
                        } catch (SQLException e) {
                        }finally {
                            refToStmt_.remove(pRef);
                        }
                    }
                }
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_gcStmts].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization removeElement()is now synchronized.
     */
    synchronized void removeElement(SQLMXStatement stmt) {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_removeElement_L].methodEntry();
        try {
            // if (stmt.pRef_.isEnqueued())
            // don't know what to do
            refToStmt_.remove(stmt.pRef_);
            stmt.pRef_.clear();
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_removeElement_L].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization addElement()is now synchronized.
     */
    synchronized void addElement(SQLMXStatement stmt) {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_addElement].methodEntry();
        try {
            //venu changed from Int to Long
            refToStmt_.put(stmt.pRef_, new Long(stmt.stmtId_));
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_addElement].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization connectInit() is now synchronized.
     */
    synchronized void connectInit() throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_connectInit].methodEntry();
        // Big Num Changes
        //Current tx = new Current();
        //int status =0;
        try {
            if (!connectInitialized_) {
                try {
                    connectInit(server_, getDialogueId(), catalog_, schema_,
                            isReadOnly_, autoCommit_,
                            mapTxnIsolation(transactionIsolation_),
                            loginTimeout_, queryTimeout_, 
                            statisticsIntervalTime_, statisticsLimitTime_, statisticsType_, programStatisticsEnabled_, statisticsSqlPlanEnabled_
                    );

                    if (iso88591EncodingOverride_ != null)
                    setCharsetEncodingOverride(server_, getDialogueId(),
                            SQLMXDesc.SQLCHARSETCODE_ISO88591,
                            iso88591EncodingOverride_);
                } catch (SQLException e) {
                    if (pc_ != null)
                    pc_.sendConnectionErrorEvent(e);
                    else
                    close(true, true);
                    throw e;
                }
                connectInitialized_ = true;
            }

        }
        finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_connectInit].methodExit();

        }
    }

    void removeElement() {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_removeElement_V].methodEntry();
        try {
            if (ds_ != null) {
                ds_.weakConnection.removeElement(this);
                ds_ = null;
            } else if (pc_ != null) {
                pc_.removeElement(this);
                pc_ = null;
            } else {
                driver_.weakConnection.removeElement(this);
                driver_ = null;
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_removeElement_V].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization close() is now synchronized.
     */
    synchronized void close(boolean hardClose, boolean sendEvents)
    throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_close_Z].methodEntry(JdbcDebug.debugLevelPooling);
        if (JdbcDebugCfg.traceActive)
        debug[methodId_close_Z].methodParameters("hardClose=" + hardClose
                + ", sendEvents=" + sendEvents);
        try {
            clearWarnings();

            if (!hardClose) {

                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() + "close()"+" Connection logically closed");
                    out_.println(getTraceId() + "close(hardClose="+hardClose +",sendEvents="+sendEvents+")");
                }
                if (isClosed_)
                return;
                if (isStatementCachingEnabled()) {
                    Object[] csArray = null;
                    csArray = (prepStmtsInCache_.values()).toArray();
                    closePreparedStatementsAll();
                    //Venu changed the below line from int to Long for 64 bit
                    ArrayList<Long> stmtIds = new ArrayList<Long>(
                            refToStmt_.values());
                    //Venu changed the below line from Int to Long
                    ArrayList<Long> listOfStmtsClosed = new ArrayList<Long>();
                    /*
                     * List to store the Statement Id Pointer.
                     */
                    // venu changed the below line from Int to Long
                    ArrayList<Long> listOfCachedPrepStmtIds = new ArrayList<Long>();
                    for (int nfor = 0; nfor < csArray.length; ++nfor) {
                        listOfCachedPrepStmtIds
                        .add(((CachedPreparedStatement) csArray[nfor])
                                .getPstmt_().stmtId_);
                    }
                    csArray = null;
                    for (int i = 0; i < stmtIds.size(); i++) {
                        /*
                         * If the Statement is not found in
                         * CachedPreparedStatements. Then Close it.
                         */
                        if (!listOfCachedPrepStmtIds.contains(stmtIds.get(i))) {
                            try {
                                // getDialogueId()
                                SQLMXStatement.close(server_, getDialogueId(),
                                        ((Long) stmtIds.get(i)).intValue(),
                                        true);
                            } catch (SQLException se) {

                            }finally {
                                /*
                                 * Mark this Statement so that this Statement is
                                 * removed from the Statement References table.
                                 */
                                listOfStmtsClosed.add(stmtIds.get(i));
                            }
                        }
                    }
                    listOfCachedPrepStmtIds.clear();
                    /*
                     * Remove the Statement marked (already closed) from the
                     * Statement Reference table.
                     */
                    Set<WeakReference> ks = refToStmt_.keySet();
                    Iterator<WeakReference> iter = ks.iterator();
                    ArrayList<WeakReference> listOfPrefs = new ArrayList<WeakReference>();
                    int nfor = 0;
                    while (iter.hasNext()) {
                        WeakReference pRef = iter.next();
                        if (listOfStmtsClosed.contains(refToStmt_.get(pRef))) {
                            listOfPrefs.add(pRef);
                        }
                    }
                    for (nfor = 0; nfor < listOfPrefs.size(); ++nfor) {
                        refToStmt_.remove(listOfPrefs.get(nfor));
                    }
                    listOfPrefs.clear();
                    /*
                     * Clear off the Temp list.
                     */
                    listOfStmtsClosed.clear();
                } else {
                    // close all the statements
                    //venu changed the below line from Int to Long
                    ArrayList<Long> stmtIds = new ArrayList<Long>(
                            refToStmt_.values());
                    int size = stmtIds.size();
                    for (int i = 0; i < size; i++) {
                        try {
                            SQLMXStatement
                            .close(server_, getDialogueId(),
                                    ((Long) stmtIds.get(i))
                                    .longValue(), true);
                        } catch (SQLException se) {
                            // Ignore any exception and proceed to the next
                            // statement
                        }
                    }
                    refToStmt_.clear();
                }
                // Need to logically close the statement
                // Rollback the Transaction independent of autoCommit mode
                if (getTxid() != 0) {
                    try {
                        rollback(server_, getDialogueId(), getTxid());
                    } catch (SQLException se1) {
                    }
                    setTxid_(0);
                }
                pc_.logicalClose(sendEvents);
                isClosed_ = true;
            } else {

                if (traceFlag_ >= T2Driver.POOLING_LVL) {
                    out_.println(getTraceId() +"close()"+" Connection Hard closed");
                    out_.println(getTraceId() + "close(hardClose="+hardClose +",sendEvents="+sendEvents+")");
                }
                if (getDialogueId() == 0)
                return;
                // close all the statements
                Set<WeakReference> ks1 = refToStmt_.keySet();
                Iterator<WeakReference> iter1 = ks1.iterator();
                ArrayList<WeakReference> listOfStmts = new ArrayList<WeakReference> ();
                while (iter1.hasNext()) {
                    WeakReference pRef = iter1.next();
                    listOfStmts.add(pRef);
                }
                for(int nfor=0;nfor<listOfStmts.size();nfor++) {
                    SQLMXStatement st=(SQLMXStatement)(listOfStmts.get(nfor)).get();
                    if (st != null) {
                        try {
                            st.close();
                        }
                        catch(SQLException se) {
                            // Ignore any exception and proceed to the next
                            // statement
                        }
                    }
                }
                refToStmt_.clear();
                // Need to logically close the statement
                // Rollback the Transaction independent of autoCommit mode
                if (getTxid() != 0) {
                    try {
                        rollback(server_, getDialogueId(), getTxid());
                    } catch (SQLException se1) {
                    }
                    setTxid_(0);
                }
                if (isStatementCachingEnabled())
                clearPreparedStatementsAll();
                // Close the connection
                try {
                    // getDialogueId(),setDialogueI_()
                    SQLMXConnection.close(server_, getDialogueId());
                }finally {
                    isClosed_ = true;
                    keyForMap=this.incrementAndGetkeyForMapCounter();
                    mapOfClosedDialogs.put(keyForMap, getDialogueId());

                    setDialogueId(0);
                    removeElement();
                }
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_close_Z].methodExit();
        }
    }

    /*
     * RFE: Connection synchronization reuse() is now synchronized.
     */
    synchronized void reuse() throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_reuse].methodEntry(JdbcDebug.debugLevelPooling);
        try {
            if (connReuseBitMap_ != 0) {
                connectReuse(server_, getDialogueId(), connReuseBitMap_,
                        dsCatalog_, dsSchema_, 
                        TRANSACTION_READ_COMMITTED);
                // Reset all connection attribute values
                catalog_ = dsCatalog_;
                schema_ = dsSchema_;
                transactionIsolation_ = TRANSACTION_READ_COMMITTED;
                connReuseBitMap_ = 0;
            }
            batchBindingSize_ = dsBatchBindingSize_;
            autoCommit_ = true;
            isReadOnly_ = false;
            isClosed_ = false;
            setTxid_(0);
            transactionMode_ = dsTransactionMode_;
            iso88591EncodingOverride_ = dsIso88591EncodingOverride_;
            contBatchOnErrorval_ = dsContBatchOnError_; // RFE: Batch update
            // improvements
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_reuse].methodExit();
        }
    }

    void updateConnectionReusability(int stmtType) {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_updateConnectionReusability]
        .methodEntry(JdbcDebug.debugLevelPooling);
        try {
            switch (stmtType) {
                case SQL_CONTROL:
                connReuseBitMap_ |= SQL_CONTROL_FLAG;
                break;
                case SQL_SET_CATALOG:
                connReuseBitMap_ |= SQL_SET_CATALOG_FLAG;
                break;
                case SQL_SET_SCHEMA:
                connReuseBitMap_ |= SQL_SET_SCHEMA_FLAG;
                break;
                case SQL_SET_TRANSACTION:
                connReuseBitMap_ |= SQL_SET_TRANSACTION_FLAG;
                break;
            }
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_updateConnectionReusability].methodExit();
        }
    }
    //
    // Extension method for WLS, this method gives the pooledConnection object
    // associated with the given connection object.
    public PooledConnection getPooledConnection() throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_getPooledConnection]
        .methodEntry(JdbcDebug.debugLevelPooling);
        try {
            if (pc_ == null)
            throw Messages.createSQLException(locale_,
                    "null_pooled_connection", null);
            if (JdbcDebugCfg.traceActive)
            debug[methodId_getPooledConnection].methodReturn("pc="
                    + JdbcDebug.debugObjectStr(pc_));
            return pc_;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getPooledConnection].methodExit();
        }
    }

    static int mapTxnMode(String txnModeStr) {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_mapTxnMode].methodEntry(JdbcDebug.debugLevelPooling);
        try {
            int txnMode;

            if (txnModeStr.equalsIgnoreCase("internal") || txnModeStr.equals("1"))
            txnMode = TXN_MODE_INTERNAL;
            else if (txnModeStr.equalsIgnoreCase("mixed") || txnModeStr.equals("2"))
            txnMode = TXN_MODE_MIXED;
            else if (txnModeStr.equalsIgnoreCase("external") || txnModeStr.equals("3"))
            txnMode = TXN_MODE_EXTERNAL;
            else
            txnMode = TXN_MODE_INVALID;
            return txnMode;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_mapTxnMode].methodExit();
        }
    }

    static String mapTxnModeToString(int txnMode) {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_mapTxnModeToString]
        .methodEntry(JdbcDebug.debugLevelPooling);
        try {
            String txnModeStr = null;

            switch (txnMode) {
                case 1:
                txnModeStr = "internal";
                break;
                case 2:
                txnModeStr = "mixed";
                break;
                case 3:
                txnModeStr = "external";
                break;
                default:
                txnModeStr = "mixed";
            }
            return txnModeStr;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_mapTxnModeToString].methodExit();
        }
    }

private void initSetDefaults() throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_initSetDefaults].methodEntry();
        try {
            clearWarnings();
            autoCommit_ = true;
            transactionIsolation_ = TRANSACTION_READ_COMMITTED;
            isReadOnly_ = false;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_initSetDefaults].methodExit();
        }
    }

    // Log the JDBC SQL statement and the STMTID to the idMapFile if the
    // enableLog_ property is set.
    private void printIdMapEntry(SQLMXStatement stmt) {
        SQLMXDataSource.prWriter_.println("["
                + T2Driver.dateFormat.format(new java.util.Date()) + "] "
                + stmt.getStmtLabel_() + " (" + stmt.sql_.trim() + ")\n");
    }

    // Constructors with access specifier as "default"
    SQLMXConnection(T2Driver driver, String url, T2Properties info)
    throws SQLException {
        super();
        if (JdbcDebugCfg.entryActive)
        debug[methodId_SQLMXConnection_LLL].methodEntry();
        /*	this.txIDPerThread = new ThreadLocal<Integer>() {
         protected synchronized Integer initialValue() {
         return new Integer(0);
         }
         };*/
        try {
            driver_ = driver;
            url_ = url;
            initSetDefaults();

            t2props = info;
            initConnectionProps(t2props);
//			catalog_ = T2Driver.catalog_;
//			schema_ = T2Driver.schema_;
//			locale_ = T2Driver.locale_;
//			batchBindingSize_ = T2Driver.batchBindingSize_;
//
//			connectionTimeout_ = 60;

            setDialogueId(connect(server_, uid_, pwd_));
            if (getDialogueId() == 0)
            return;
            isClosed_ = false;
            byteSwap_ = false;

            refQ_ = new ReferenceQueue<SQLMXStatement>();
            refToStmt_ = new HashMap<WeakReference, Long>();
            pRef_ = new WeakReference<SQLMXConnection>(this, driver_.weakConnection.refQ_);
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_SQLMXConnection_LLL].methodExit();
        }
    }

    SQLMXConnection(SQLMXDataSource ds, T2Properties properties)
    throws SQLException {
        super();
        if (JdbcDebugCfg.entryActive)
        debug[methodId_SQLMXConnection_LL_ds].methodEntry();

        t2props = properties;
        if(this.t2props.getLogWriter()!=null) {
            this.setTracer(this.t2props.getLogWriter());
        }

        if (this.getTracer() != null)
        this.getTracer().println(getTraceId() + "<Init>");

        /*
         this.txIDPerThread = new ThreadLocal<Integer>() {
         protected synchronized Integer initialValue() {
         return new Integer(0);
         }
         };*/

        try {
            ds_ = ds;
            initSetDefaults();

//			dsn_ = properties.getProperty("dataSourceName");
//			dsn_ = properties.getDataSourceName();

            // Obtain all the property info
//			getProperties(properties);

            initConnectionProps(t2props);

            setDialogueId(connect(server_, uid_, pwd_));
            if (getDialogueId() == 0)
            return;
            isClosed_ = false;
            byteSwap_ = false;

            setIsSpjRSFlag(getDialogueId(), t2props.isSpjrsOn());

            refQ_ = new ReferenceQueue<SQLMXStatement>();
            refToStmt_ = new HashMap<WeakReference, Long>();
            pRef_ = new WeakReference<SQLMXConnection>(this,WeakConnection.refQ_);
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_SQLMXConnection_LL_ds].methodExit();
        }
    }

    SQLMXConnection(SQLMXPooledConnection poolConn, T2Properties info)
    throws SQLException {
        super(info);
        if (JdbcDebugCfg.entryActive)
        debug[methodId_SQLMXConnection_LL_pool]
        .methodEntry(JdbcDebug.debugLevelPooling);
        if (JdbcDebugCfg.traceActive)
        debug[methodId_getProperties].methodParameters("poolConn="
                + JdbcDebug.debugObjectStr(poolConn) + ", info="
                + JdbcDebug.debugObjectStr(info));
        t2props = info;
        if(this.t2props.getTraceFile()!=null&&SQLMXDataSource.traceWriter_!=null) {
            this.setTracer(SQLMXDataSource.traceWriter_);
        }

        if (this.getTracer() != null)
        this.getTracer().println(getTraceId() + "<Init>");

        /*	this.txIDPerThread = new ThreadLocal<Integer>() {
         protected synchronized Integer initialValue() {
         return new Integer(0);
         }
         };*/

        try {
            pc_ = poolConn;
            initSetDefaults();

//			getProperties(info);

            initConnectionProps(t2props);

            setDialogueId(connect(server_, uid_, pwd_));
            if (getDialogueId() == 0)
            return;
            isClosed_ = false;
            byteSwap_ = false;

            refQ_ = new ReferenceQueue<SQLMXStatement>();
            refToStmt_ = new HashMap<WeakReference, Long>();
            pRef_ = new WeakReference<SQLMXConnection>(this,
                    SQLMXPooledConnection.refQ_);
            holdability_ = SQLMXResultSet.CLOSE_CURSORS_AT_COMMIT;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_SQLMXConnection_LL_pool].methodExit();
        }
    }

    static String getCharsetEncodingCached(String server, long dialogueId,
            int charset, String encodingOverride) throws SQLException {
        if (JdbcDebugCfg.entryActive)
        debug[methodId_getCharsetEncodingCached]
        .methodEntry(JdbcDebug.debugLevelPooling);
        try {
            if ((server == getCharsetEncodingCached_server)
                    && (dialogueId == getCharsetEncodingCached_dialogueId)
                    && (charset == getCharsetEncodingCached_charset)
                    && (encodingOverride == getCharsetEncodingCached_encodingOverride))
            return getCharsetEncodingCached_encoding;
            getCharsetEncodingCached_encoding = getCharsetEncoding(server,
                    dialogueId, charset, encodingOverride);
            getCharsetEncodingCached_server = server;
            getCharsetEncodingCached_dialogueId = dialogueId;
            getCharsetEncodingCached_charset = charset;
            getCharsetEncodingCached_encodingOverride = encodingOverride;
            return getCharsetEncodingCached_encoding;
        }finally {
            if (JdbcDebugCfg.entryActive)
            debug[methodId_getCharsetEncodingCached].methodExit();
        }
    }

public static boolean getSqlStmtType2(String str) {
        if ( getSqlStmtType(str.toUpperCase()) == TYPE_INSERT_PARAM
                || getSqlStmtType(str.toUpperCase()) == TYPE_INSERT
                || getSqlStmtType(str.toUpperCase()) == TYPE_UPDATE
                || getSqlStmtType(str.toUpperCase()) == TYPE_DELETE
        )
        {
            return true;
        } else {
            return false;
        }
    }

    static short getSqlStmtType(String str) {
        //
        // Kludge to determin if the type of statement.
        //
        String tokens[] = str.split("[^a-zA-Z]+", 3);
        short rt1 = TYPE_UNKNOWN;
        String str3 = "";

        //
        // If there are no separators (i.e. no spaces, {, =, etc.) in front of
        // the
        // first token, then the first token is the key word we are looking for.
        // Else, the first token is an empty string (i.e. split thinks the first
        // token is the empty string followed by a separator), and the second
        // token is the key word we are looking for.
        //
        if (tokens[0].length() > 0) {
            str3 = tokens[0].toUpperCase();
        } else {
            str3 = tokens[1].toUpperCase();
        }

        if ((str3.equals("SELECT")) || (str3.equals("SHOWSHAPE"))
                || (str3.equals("INVOKE")) || (str3.equals("SHOWCONTROL"))
                || (str3.equals("SHOWPLAN"))) {
            rt1 = TYPE_SELECT;
        } else if (str3.equals("UPDATE")) {
            rt1 = TYPE_UPDATE;
        } else if (str3.equals("DELETE")) {
            rt1 = TYPE_DELETE;
        } else if (str3.equals("INSERT") || (str.equals("UPSERT"))) {
            if (str.indexOf('?') == -1) {
                rt1 = TYPE_INSERT;
            } else {
                rt1 = TYPE_INSERT_PARAM;
            }
        } else if (str3.equals("EXPLAIN")) {
            rt1 = TYPE_EXPLAIN;
        } else if (str3.equals("CREATE")) {
            rt1 = TYPE_CREATE;
        } else if (str3.equals("GRANT")) {
            rt1 = TYPE_GRANT;
        } else if (str3.equals("DROP")) {
            rt1 = TYPE_DROP;
        } else if (str3.equals("CALL")) {
            rt1 = TYPE_CALL;
        } else if (str3.equals("EXPLAIN")) {
            rt1 = TYPE_EXPLAIN;
        } else if (str3.equals("CONTROL")) {
            rt1 = TYPE_CONTROL;
        } else {
            rt1 = TYPE_UNKNOWN;

        }
        return rt1;

    }

    // Native methods
private native void setCatalog(String server, long dialogueId, String Catalog);

private native void setTransactionIsolation(String server, long dialogueId,
            int level);
private native void setAutoCommit(String server, long dialogueId, boolean autoCommit);

    // SPJRS
private native void setIsSpjRSFlag(long dialogueId, boolean isSpjrsOn);

    // private native void setReadOnly(String server, int dialogueId, boolean
    // readOnly);
private native void connectInit(String server, long dialogueId,
            String catalog, String schema, boolean isReadOnly, boolean autoCommit,
            int transactionIsolation, int loginTimeout, int queryTimeout,
            int statisticsIntervalTime_, int statisticsLimitTime_, String statisticsType_, String programStatisticsEnabled_, String statisticsSqlPlanEnabled_) throws SQLException;

private native void connectReuse(String server, long dialogueId,
            int conResetValue, String catalog, String schema, 
            int transactionIsolation) throws SQLException;

private native long connect(String server, String uid, String pwd);

    static native void close(String server, long dialogueId) throws SQLException;

private native void commit(String server, long dialogueId, int txid)
    throws SQLException;

private native void rollback(String server, long dialogueId, int txid)
    throws SQLException;

private native int beginTransaction(String server, long dialogueId);

    static native String getCharsetEncoding(String server, long dialogueId,
            int charset, String encodingOverride) throws SQLException;

    native void setCharsetEncodingOverride(String server, long dialogueId,
            int charset, String encodingOverride) throws SQLException;

public void setTxid_(int txid_) {
        this.txid_ = txid_;
//		this.txIDPerThread.set(new Integer(txid_));
    }

public int getTxid() {
        return txid_;
//		return this.txIDPerThread.get().intValue();
    }

public void setDialogueId(long dialogueId_) throws SQLException {
        this.dialogueId_ = dialogueId_;
    }
public long getDialogueId() throws SQLException {
        if(dialogueId_ != 0) {
            if(mapOfClosedDialogs.containsKey(this.keyForMap)) {
                throw new SQLException(Long.toHexString(mapOfClosedDialogs.get(this.keyForMap)) + " Connection is already closed.");
            }
        }
        return dialogueId_;
    }

    /**
     * @param tracer the tracer to set
     */
public void setTracer(PrintWriter tracer) {
        setTraceId(org.apache.trafodion.jdbc.t2.T2Driver.traceText
                + org.apache.trafodion.jdbc.t2.T2Driver.dateFormat.format(new Date())
                + "]:["
                + Thread.currentThread()
                + "]:["
                + System.identityHashCode(this)
                + "]:"
                + this.getClass().getName().substring(
                        org.apache.trafodion.jdbc.t2.T2Driver.REMOVE_PKG_NAME, this.getClass().getName()
                        .length()) + ".");
        this.out_ = tracer;
    }

    /**
     * @return the tracer
     */
public PrintWriter getTracer() {
        return out_;
    }

public void initConnectionProps(T2Properties info) {

        dsn_ = info.getDataSourceName();
        transactionMode_ = mapTxnMode(info.getTransactionMode());
        catalog_ = info.getCatalog();
        schema_ = info.getSchema();
        inlineLobChunkSize_ = info.getInlineLobChunkSize();
        lobChunkSize_ = info.getLobChunkSize();
        String lang = info.getLanguage();
        if (lang == null)
            locale_ = Locale.getDefault();
        else {
            if (lang.equalsIgnoreCase("ja"))
            locale_ = new Locale("ja", "", "");
            else if (lang.equalsIgnoreCase("en"))
            locale_ = new Locale("en", "", "");
            else
            locale_ = Locale.getDefault();
        }
        batchBindingSize_ = info.getBatchBinding();
        connectionTimeout_ = 60;
        loginTimeout_ = info.getLoginTimeout();
        contBatchOnError_ = info.getContBatchOnError();
        iso88591EncodingOverride_ = info.getIso88591EncodingOverride();

        //Publishing
        statisticsIntervalTime_ = info.getStatisticsIntervalTime();
        statisticsLimitTime_ = info.getStatisticsLimitTime();
        statisticsType_ = info.getStatisticsType();
        programStatisticsEnabled_ = info.getProgramStatisticsEnabled();
        statisticsSqlPlanEnabled_ = info.getStatisticsSqlPlanEnabled();

        dsCatalog_ = catalog_;
        dsSchema_ = schema_;
        dsBatchBindingSize_ = batchBindingSize_;
        dsTransactionMode_ = transactionMode_;
        dsIso88591EncodingOverride_ = iso88591EncodingOverride_;
        dsContBatchOnError_ = contBatchOnErrorval_;// RFE: Batch update

        // The enableLog_ flag is used to log SQL STMTIDs and their SQL strings
        // if the
        // enableLog and idMapFile system properties are not null, and the
        // enableLog
        // system property is set to "on".
        if ((info.getEnableLog() != null) && (info.getIdMapFile() != null) && (info.getEnableLog().equalsIgnoreCase("on"))) {
            synchronized (SQLMXDataSource.class) {
                if (SQLMXDataSource.prWriter_ == null) {
                    try {
                        SQLMXDataSource.prWriter_ = new PrintWriter(new FileOutputStream(info.getIdMapFile(), true), true);
                    } catch (java.io.IOException e) {
                        SQLMXDataSource.prWriter_ = new PrintWriter(System.err, true);
                    }
                }
            }
        }

    }

    //Jaime
public synchronized long incrementAndGetkeyForMapCounter() {

        return ++keyForMapCounter;
    }

    public int getInlineLobChunkSize()
    {
        return inlineLobChunkSize_;
    }

    public int getLobChunkSize()
    {
        return lobChunkSize_;
    }

public static final int SQL_TXN_READ_UNCOMMITTED = 1;
public static final int SQL_TXN_READ_COMMITTED = 2;
public static final int SQL_TXN_REPEATABLE_READ = 4;
public static final int SQL_TXN_SERIALIZABLE = 8;

public static final int TXN_MODE_INVALID = 0;
public static final int TXN_MODE_INTERNAL = 1;
public static final int TXN_MODE_MIXED = 2;
public static final int TXN_MODE_EXTERNAL = 3;

public static final String UCS_STR = "UCS2";

    // Added the following for Connection pooling enhancement (Amena).
    // {Note: These must match what is defined in sqlcli.h}
public static final int SQL_CONTROL = 9;
public static final int SQL_SET_TRANSACTION = 10;
public static final int SQL_SET_CATALOG = 11;
public static final int SQL_SET_SCHEMA = 12;

public static final int SQL_CONTROL_FLAG = 0x0008;
public static final int SQL_SET_CATALOG_FLAG = 0x0004;
public static final int SQL_SET_SCHEMA_FLAG = 0x0002;
public static final int SQL_SET_TRANSACTION_FLAG = 0x0001;

    // Fields
    static long rsCount_;
    boolean beginTransFlag_ = false;
    String server_;
    String dsn_;
    boolean autoCommit_;
    String catalog_;
    String schema_;
    int transactionIsolation_;
    boolean isClosed_;
    boolean isReadOnly_;
    String url_;
    String uid_;
    String pwd_;
    int loginTimeout_;
    int queryTimeout_;
    int connectionTimeout_;
    int inlineLobChunkSize_;
    int lobChunkSize_;
    private long dialogueId_;
    int hClosestmtCount=0;
    int lClosestmtCount=0;
    int pStmtCount=0;

    //Publishing
    int statisticsIntervalTime_;
    int statisticsLimitTime_;
    String statisticsType_;
    String programStatisticsEnabled_;
    String statisticsSqlPlanEnabled_;

    boolean byteSwap_;
    private int txid_;
    //ThreadLocal<Integer> txIDPerThread;
    Map<String, Class<?>> userMap_;
    Locale locale_;
    ReferenceQueue<SQLMXStatement> refQ_;
    HashMap<WeakReference, Long> refToStmt_;
    boolean connectInitialized_;
    int holdability_;
    int batchBindingSize_;
    String contBatchOnError_;
    boolean contBatchOnErrorval_;
    WeakReference<SQLMXConnection> pRef_;
    SQLMXDataSource ds_;
    SQLMXPooledConnection pc_;
    T2Driver driver_;

    T2Properties t2props;

    int transactionMode_;
    String iso88591EncodingOverride_;

    String dsCatalog_;
    String dsSchema_;

    // Bit-mapped value that corresponds to what SQL connection
    // attribute statements that have been executed within the connection
    // context
    int connReuseBitMap_;

    // Cache area for character set
    static String getCharsetEncodingCached_server;
    static long getCharsetEncodingCached_dialogueId;
    static int getCharsetEncodingCached_charset;
    static String getCharsetEncodingCached_encodingOverride;
    static String getCharsetEncodingCached_encoding;

private static int methodId_close_V = 0;
private static int methodId_close_Z = 1;
private static int methodId_commit = 2;
private static int methodId_createStatement = 3;
private static int methodId_createStatement_II = 4;
private static int methodId_createStatement_III = 5;
private static int methodId_getAutoCommit = 6;
private static int methodId_getCatalog = 7;
private static int methodId_getHoldability = 8;
private static int methodId_getMetaData = 9;
private static int methodId_getTransactionIsolation = 10;
private static int methodId_getTypeMap = 11;
private static int methodId_isClosed = 12;
private static int methodId_isReadOnly = 13;
private static int methodId_nativeSQL = 14;
private static int methodId_prepareCall_L = 15;
private static int methodId_prepareCall_LII = 16;
private static int methodId_prepareCall_LIII = 17;
private static int methodId_prepareStatement_L = 18;
private static int methodId_prepareStatement_LI = 19;
private static int methodId_prepareStatement_LI_array = 20;
private static int methodId_prepareStatement_LL_array = 21;
private static int methodId_prepareStatement_LII = 22;
private static int methodId_prepareStatement_LIII = 23;
private static int methodId_releaseSavepoint = 24;
private static int methodId_rollback_V = 25;
private static int methodId_rollback_L = 26;
private static int methodId_setAutoCommit = 27;
private static int methodId_setCatalog = 28;
private static int methodId_setHoldability = 29;
private static int methodId_setReadOnly = 30;
private static int methodId_setSavepoint_L = 31;
private static int methodId_setSavepoint_V = 32;
private static int methodId_setTransactionIsolation = 33;
private static int methodId_setTypeMap = 34;
private static int methodId_begintransaction = 35;
private static int methodId_mapTxnIsolation = 36;
private static int methodId_gcStmts = 37;
private static int methodId_removeElement_L = 38;
private static int methodId_removeElement_V = 39;
private static int methodId_addElement = 40;
private static int methodId_connectInit = 41;
private static int methodId_reuse = 42;
private static int methodId_updateConnectionReusability = 43;
private static int methodId_getDataLocator = 44;
private static int methodId_getPooledConnection = 45;
private static int methodId_getProperties = 46;
private static int methodId_SQLMXConnection_LLL = 47;
private static int methodId_SQLMXConnection_LL_ds = 48;
private static int methodId_SQLMXConnection_LL_pool = 49;
private static int methodId_mapTxnMode = 50;
private static int methodId_mapTxnModeToString = 51;
private static int methodId_initSetDefaults = 52;
private static int methodId_getCharsetEncodingCached = 53;
private static int methodId_getSchema = 54;
private static int totalMethodIds = 55;
private static JdbcDebug[] debug;

    static {
        String className = "SQLMXConnection";
        if (JdbcDebugCfg.entryActive) {
            debug = new JdbcDebug[totalMethodIds];
            debug[methodId_close_V] = new JdbcDebug(className, "close_V");
            debug[methodId_close_Z] = new JdbcDebug(className, "close_Z");
            debug[methodId_commit] = new JdbcDebug(className, "commit");
            debug[methodId_createStatement] = new JdbcDebug(className,
                    "createStatement");
            debug[methodId_createStatement_II] = new JdbcDebug(className,
                    "createStatement");
            debug[methodId_createStatement_III] = new JdbcDebug(className,
                    "createStatement");
            debug[methodId_getAutoCommit] = new JdbcDebug(className,
                    "getAutoCommit");
            debug[methodId_getCatalog] = new JdbcDebug(className, "getCatalog");
            debug[methodId_getHoldability] = new JdbcDebug(className,
                    "getHoldability");
            debug[methodId_getMetaData] = new JdbcDebug(className,
                    "getMetaData");
            debug[methodId_getTransactionIsolation] = new JdbcDebug(className,
                    "getTransactionIsolation");
            debug[methodId_getTypeMap] = new JdbcDebug(className, "getTypeMap");
            debug[methodId_isClosed] = new JdbcDebug(className, "isClosed");
            debug[methodId_isReadOnly] = new JdbcDebug(className, "isReadOnly");
            debug[methodId_nativeSQL] = new JdbcDebug(className, "nativeSQL");
            debug[methodId_prepareCall_L] = new JdbcDebug(className,
                    "prepareCall[L]");
            debug[methodId_prepareCall_LII] = new JdbcDebug(className,
                    "prepareCall[LII]");
            debug[methodId_prepareCall_LIII] = new JdbcDebug(className,
                    "prepareCall[LIII]");
            debug[methodId_prepareStatement_L] = new JdbcDebug(className,
                    "prepareStatement[L]");
            debug[methodId_prepareStatement_LI] = new JdbcDebug(className,
                    "prepareStatement[LI]");
            debug[methodId_prepareStatement_LI_array] = new JdbcDebug(
                    className, "prepareStatement[LI_array]");
            debug[methodId_prepareStatement_LL_array] = new JdbcDebug(
                    className, "prepareStatement[LL_array]");
            debug[methodId_prepareStatement_LII] = new JdbcDebug(className,
                    "prepareStatement[LII]");
            debug[methodId_prepareStatement_LIII] = new JdbcDebug(className,
                    "prepareStatement[LIII]");
            debug[methodId_releaseSavepoint] = new JdbcDebug(className,
                    "releaseSavepoint");
            debug[methodId_rollback_V] = new JdbcDebug(className, "rollback_V");
            debug[methodId_rollback_L] = new JdbcDebug(className, "rollback_L");
            debug[methodId_setAutoCommit] = new JdbcDebug(className,
                    "setAutoCommit");
            debug[methodId_setCatalog] = new JdbcDebug(className, "setCatalog");
            debug[methodId_setHoldability] = new JdbcDebug(className,
                    "setHoldability");
            debug[methodId_setReadOnly] = new JdbcDebug(className,
                    "setReadOnly");
            debug[methodId_setSavepoint_L] = new JdbcDebug(className,
                    "setSavepoint[L]");
            debug[methodId_setSavepoint_V] = new JdbcDebug(className,
                    "setSavepoint[V]");
            debug[methodId_setTransactionIsolation] = new JdbcDebug(className,
                    "setTransactionIsolation");
            debug[methodId_setTypeMap] = new JdbcDebug(className, "setTypeMap");
            debug[methodId_begintransaction] = new JdbcDebug(className,
                    "begintransaction");
            debug[methodId_mapTxnIsolation] = new JdbcDebug(className,
                    "mapTxnIsolation");
            debug[methodId_gcStmts] = new JdbcDebug(className, "gcStmts");
            debug[methodId_removeElement_L] = new JdbcDebug(className,
                    "removeElement[L]");
            debug[methodId_removeElement_V] = new JdbcDebug(className,
                    "removeElement[V]");
            debug[methodId_addElement] = new JdbcDebug(className, "addElement");
            debug[methodId_connectInit] = new JdbcDebug(className,
                    "connectInit");
            debug[methodId_reuse] = new JdbcDebug(className, "reuse");
            debug[methodId_updateConnectionReusability] = new JdbcDebug(
                    className, "updateConnectionReusability");
            debug[methodId_getDataLocator] = new JdbcDebug(className,
                    "getDataLocator");
            debug[methodId_getPooledConnection] = new JdbcDebug(className,
                    "getPooledConnection");
            debug[methodId_getProperties] = new JdbcDebug(className,
                    "getProperties");
            debug[methodId_SQLMXConnection_LLL] = new JdbcDebug(className,
                    "SQLMXConnection[LLL]");
            debug[methodId_SQLMXConnection_LL_ds] = new JdbcDebug(className,
                    "SQLMXConnection[LL_ds]");
            debug[methodId_SQLMXConnection_LL_pool] = new JdbcDebug(className,
                    "SQLMXConnection[LL_pool]");
            debug[methodId_mapTxnMode] = new JdbcDebug(className, "mapTxnMode");
            debug[methodId_mapTxnModeToString] = new JdbcDebug(className,
                    "mapTxnModeToString");
            debug[methodId_initSetDefaults] = new JdbcDebug(className,
                    "initSetDefaults");
            debug[methodId_getCharsetEncodingCached] = new JdbcDebug(className,
                    "getCharsetEncodingCached");
        }

    }
    int dsBatchBindingSize_;
    int dsTransactionMode_;
    String dsIso88591EncodingOverride_;
    boolean dsContBatchOnError_; // RFE: Batch update improvements
    static final HashMap<Long, Long> mapOfClosedDialogs = new HashMap<Long, Long>();
    static private long keyForMapCounter = 0;
private long keyForMap;

private PrintWriter tracer;
    PreparedStatement clearCQD1;
    PreparedStatement clearCQD2;
    PreparedStatement clearCQD3;

public Object unwrap(Class iface) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

public boolean isWrapperFor(Class iface) throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

public Clob createClob() throws SQLException {
	return new SQLMXClob(this, null);
    }

public Blob createBlob() throws SQLException {
        return new SQLMXBlob(this, null);
    }

public NClob createNClob() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

public SQLXML createSQLXML() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

public boolean isValid(int timeout) throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

public void setClientInfo(String name, String value)
    throws SQLClientInfoException {
        // TODO Auto-generated method stub

    }

public void setClientInfo(Properties properties)
    throws SQLClientInfoException {
        // TODO Auto-generated method stub

    }

public String getClientInfo(String name) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

public Properties getClientInfo() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

public Array createArrayOf(String typeName, Object[] elements)
    throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

public Struct createStruct(String typeName, Object[] attributes)
    throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

public void setSchema(String schema) throws SQLException {
        // TODO Auto-generated method stub

    }

public void abort(Executor executor) throws SQLException {
        // TODO Auto-generated method stub

    }

public void setNetworkTimeout(Executor executor, int milliseconds)
    throws SQLException {
        // TODO Auto-generated method stub

    }

public int getNetworkTimeout() throws SQLException {
        // TODO Auto-generated method stub
        return 0;
    }

public String getSchema() throws SQLException {
    if (out_ != null)
        out_.println(getTraceId() + "getSchema()");
    if (JdbcDebugCfg.entryActive)
        debug[methodId_getSchema].methodEntry();
    try {
        clearWarnings();
        Statement s = null;
        ResultSet rs = null;
        String sch = null;

        try {
            s = this.createStatement();
            rs = s.executeQuery("SHOWCONTROL DEFAULT SCHEMA, match full, no header");
            rs.next();
            sch = rs.getString(1);
            if (sch.charAt(0) != '\"' && sch.indexOf('.') != -1) {
                sch = sch.substring(sch.indexOf('.') + 1);
            }
        } catch (SQLException e) {
            return schema_;
        } finally {
            if (rs != null)
                rs.close();
            if (s != null)
                s.close();
        }
        return sch;
    } finally {
        if (JdbcDebugCfg.entryActive)
            debug[methodId_getSchema].methodExit();
    }
    }
}
